package com.fight.strive.sys.modules.scheduler.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fight.strive.sys.modules.common.PageR;
import com.fight.strive.sys.modules.scheduler.entity.SchJobEntity;
import com.fight.strive.sys.modules.validator.StriveValid;

import java.time.LocalDateTime;
import java.util.List;

public interface SchJobService extends IService<SchJobEntity> {

    /**
     * 处理任务
     */
    void handleJob();

    /**
     * 获取所有可执行的任务
     *
     * @return 任务列表
     */
    List<SchJobEntity> getRunnableJob();

    /**
     * 保存任务
     *
     * @param entity 任务
     */
    void saveE(@StriveValid SchJobEntity entity);

    /**
     * 删除任务
     *
     * @param entity entity
     */
    void deleteJob(SchJobEntity entity);

    /**
     * 分页查询任务
     *
     * @param page 分页条件
     * @return 分页结果
     */
    IPage<SchJobEntity> list(
            PageR<SchJobEntity> page);

    /**
     * 更新任务状态
     *
     * @param entity entity
     */
    void changeStatus(SchJobEntity entity);

    /**
     * 执行一次
     *
     * @param entity entity
     */
    void runJobOnce(SchJobEntity entity);

    /**
     * 获取远程任务端点地址
     *
     * @param entity entity
     * @return url
     */
    String getServiceUrl(SchJobEntity entity);

    /**
     * 获取下一次执行时间
     *
     * @param entity entity
     * @return local date time
     */
    LocalDateTime getNextTime(SchJobEntity entity);

    /**
     * 判断执行器是否有任务
     *
     * @param execId 执行器ID
     * @return true/false
     */
    boolean executorHasJob(Long execId);

    /**
     * 执行任务
     *
     * @param entity 任务信息
     */
    void executeJob(SchJobEntity entity);
}
